// 用锁和条件变量操作两个线程交替打印A和B
#include <iostream>
#include <pthread.h>
#include <unistd.h>

using namespace std;

// 互斥锁和条件变量
pthread_mutex_t g_mutex;
pthread_cond_t g_cond;
bool printA = true; // 标志位，用于控制打印顺序

void printer(const char *str)
{
    while (*str)
    {
        putchar(*str);  // 输出一个字符
        fflush(stdout); // 确保立即输出到屏幕上
        sleep(1);       // 控制输出间隔
        str++;
    }
}

void *thread_func1(void *arg)
{
    pthread_detach(pthread_self()); // 线程分离

    const char *str = "A";
    while (true)
    {
        pthread_mutex_lock(&g_mutex); // 加锁
        while (!printA)
        {   
            // 如果不是该线程的打印轮次，则等待
            pthread_cond_wait(&g_cond, &g_mutex);
        }

        printer(str);                   // 打印 "A"
        printA = false;                 // 切换到打印 "B"
        pthread_cond_signal(&g_cond);   // 唤醒另一个线程
        pthread_mutex_unlock(&g_mutex); // 解锁
    }
    return nullptr;
}

void *thread_func2(void *arg)
{
    pthread_detach(pthread_self()); // 线程分离

    const char *str = "B";
    while (true)
    {
        pthread_mutex_lock(&g_mutex); // 加锁
        while (printA)
        { 
            // 如果不是该线程的打印轮次，则等待
            pthread_cond_wait(&g_cond, &g_mutex);
        }

        printer(str);                   // 打印 "B"
        printA = true;                  // 切换到打印 "A"
        pthread_cond_signal(&g_cond);   // 唤醒另一个线程
        pthread_mutex_unlock(&g_mutex); // 解锁
    }
    return nullptr;
}

int main()
{
    // 初始化互斥锁和条件变量
    pthread_mutex_init(&g_mutex, nullptr);
    pthread_cond_init(&g_cond, nullptr);

    // 创建线程
    pthread_t tid1, tid2;
    pthread_create(&tid1, nullptr, thread_func1, nullptr);
    pthread_create(&tid2, nullptr, thread_func2, nullptr);

    // 主线程保持运行，避免程序退出
    while (true)
    {
        sleep(1);
    }

    // 销毁互斥锁和条件变量（此处不会被执行）
    pthread_mutex_destroy(&g_mutex);
    pthread_cond_destroy(&g_cond);

    return 0;
}